﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Controller2.BLL;
using Controller2.Models;
using Controller2.Models.ViewModels;
using Telerik.Web.Mvc;

namespace Controller2.Controllers
{
	[Authorize]
	public class FornecedorController : Controller
	{
		#region ViewModels
		ControllerBDModelContainer db = new ControllerBDModelContainer();
		FornecedorViewModel viewModel = new FornecedorViewModel();
		#endregion

		#region Index
		[Authorize]
		public ActionResult Index() // Index padrão
		{
            ViewBag.IsInRole = User.IsInRole("SysAdmin") || User.IsInRole("Administrador") || User.IsInRole("Gerente") ? true : false;
			var dic = new Dictionary<string, int>();
			dic.Add("Código", 1);
			dic.Add("Nome", 2);
			ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisa(dic, "Consulta de Fornecedor: ");
			Session["texto"] = "";
			Session["filtro"] = 0;
			return View();
		}

		[Authorize]
		[GridAction]
		public ActionResult AjaxGrid() // Load da grid do Telerik
		{
			var texto = Session["texto"].ToString();
			var filtro = Convert.ToInt32(Session["filtro"]);
			var model = new GridModel { Data = viewModel.Listar(db, texto, filtro) };
			return View(model);
		}

		[Authorize]
		[HttpPost]
		public ActionResult Pesquisa(string texto, int filtro)
		{
			Session["texto"] = texto;
			Session["filtro"] = filtro;
			return Json(new { salvo = true });
		}

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        public ActionResult PesquisaFornecedor()
        {
            Session["pesquisaFornecedor"] = "";
            ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisaFornecedor();
            return View();
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public ActionResult TermosPesquisa(string texto)
        {
            Session["pesquisaFornecedor"] = texto;
            return Json(new { salvo = true });
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [GridAction]
        public ActionResult AjaxPesquisaFornecedor()
        {
            var pesquisaFornecedor = Session["pesquisaFornecedor"].ToString();
            var cli = new GridModel { Data = viewModel.Procura(db, pesquisaFornecedor) };
            return View(cli);
        }
		#endregion

		#region Cadastro
		[Authorize]
		public ActionResult Cadastro(int id) // Formulário de Cadastro
		{
			var model = new Pessoa_PJ();
			if (id > 0)
			{
				model = FornecedorBll.GetFornecedor(db, id);
                model.IdEstado = model.Cidade.IdEstado;
				ViewBag.Estado = new SelectList(db.Estado.ToList(), "IdEstado", "NomeEstado", model.IdEstado);
				ViewBag.Cidade = new SelectList(db.Cidade.Where(c => c.IdEstado == model.IdEstado), "IdCidade", "NomeCidade");
			}
			else
			{
				model.DataCadastro = DateTime.Today;
				model.DataAbertura = new DateTime(1900, 01, 01);
				ViewBag.Estado = new SelectList(db.Estado.ToList(), "IdEstado", "NomeEstado");
				ViewBag.Cidade = new SelectList(db.Cidade.ToList().Take(0), "IdCidade", "NomeCidade");
			}
			return View(model);
		}
		#endregion

		#region Salvar
		[Authorize]
		[HttpPost]
		public ActionResult Salvar(Pessoa_PJ modelView) // Método de gravação do registro
		{
			if (ModelState.IsValid)
			{
				try
				{
					if (modelView.IdPessoa > 0)
					{
						var model = FornecedorBll.GetFornecedor(db, modelView.IdPessoa);
						TryUpdateModel(model);
						db.Pessoa.ApplyCurrentValues(model);
					}
					else
					{
						var model = new Pessoa_PJ();
						TryUpdateModel(model);
                        model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Fornecedor"));
						if (modelView.Fornecedor)
						{
							var pf = new Pessoa_PJ();
							TryUpdateModel(pf);
							pf.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Cliente"));
							pf.UserName = "";
							db.Pessoa.AddObject(pf);
						}
						db.Pessoa.AddObject(model);
					}
					db.SaveChanges();

					if (Request.IsAjaxRequest())
					{
						return Json(new { salvo = true });
					}
					return RedirectToAction("Index");
				}
				catch (Exception ex)
				{
					if (Request.IsAjaxRequest())
					{
						string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
						if (ex.InnerException == null)
						{
							msgEx += ex.Message;
						}
						else
						{
							msgEx += ex.InnerException.Message;
						}
						return Json(new { salvo = false, error = msgEx });
					}
					ModelState.AddModelError(string.Empty, ex);
					return View(modelView);
				}
			}
			else
			{
				if (Request.IsAjaxRequest())
				{
					var msgEx = "Houve um erro desconhecido e não foi possível executar a operação!<br /><br />Por favor, tente novamente mais tarde ou entre em contato com o Administrador do Sistema.";
					return Json(new { salvo = false, error = msgEx });
				}
				return View(modelView);
			}
		}
		#endregion

		#region Excluir
		[Authorize]
		[HttpPost]
		public ActionResult Excluir(int id) // Método de exclusão do registro
		{
			try
			{	
				var model = FornecedorBll.GetFornecedor(db, id);
				var tp = TipoPessoaBll.GetTipoPessoa(db, 0, id);
				model.TipoPessoa.Remove(tp);
				db.Pessoa.DeleteObject(model);
				db.SaveChanges();				
				return Json(new { salvo = true });
			}
			catch (Exception ex)
			{
				string msgEx;
				if (ex.InnerException == null)
				{
					msgEx = ex.Message;
				}
				else
				{
					msgEx = ex.InnerException.Message;
				}
                if (msgEx.Contains("REFERENCE constraint"))
                {
                    msgEx = "Este fornecedor não pode ser excluído pois ele está sendo usado em outros cadastros.";
                }
				return Json(new { salvo = false, error = "Houve um erro na gravação dos dados: <br /><br />" + msgEx });
			}
		}
		#endregion

		#region AutoComplete
		[Authorize]
		[HttpPost]
		public JsonResult AutoComplete(int filtro, string termoPesquisa)
		{
			var data = FornecedorBll.AutoComplete(db, filtro, termoPesquisa, 10);
			return Json(data);
		}

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult AutoCompletePesquisaFornecedor(string termoPesquisa)
        {
            var data = FornecedorBll.AutoComplete(db, termoPesquisa, 10);
            return Json(data);
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult BuscaNomeFornecedor(int id)
        {
            var data = FornecedorBll.BuscaNomeFornecedor(db, id);
            return Json(data);
        }
		#endregion
	}
}
